﻿using System;
using System.Web.UI.WebControls;
using AuctionSite.BL;
using AuctionSite.Entities;

namespace AuctionSite
{
    public partial class Produtos : System.Web.UI.Page
    {
        public Usuario UsuarioLogado
        {
            get { return (Usuario)(Session["USUARIO"] ?? (Session["USUARIO"] = null)); }
        }

        public ProdutoFacade FacadeProduto
        {
            get { return (ProdutoFacade)(Session[ProdutoFacade.FACADE_SESSION_NAME] ?? (Session[ProdutoFacade.FACADE_SESSION_NAME] = new ProdutoFacade())); }
            set { Session[ProdutoFacade.FACADE_SESSION_NAME] = value; }
        }

        public LanceFacade FacadeLance
        {
            get { return (LanceFacade)(Session[LanceFacade.FACADE_SESSION_NAME] ?? (Session[LanceFacade.FACADE_SESSION_NAME] = new LanceFacade())); }
            set { Session[LanceFacade.FACADE_SESSION_NAME] = value; }
        }

        protected override void OnPreInit(EventArgs e)
        {
            if (!IsPostBack)
                ClearSession();

            base.OnPreInit(e);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                string categoria = Request.QueryString["cat"] ?? string.Empty;
                string subCategoria = Request.QueryString["subCat"] ?? string.Empty;
                string produto = Request.QueryString["produto"] ?? string.Empty;

                if (Request.QueryString["MyProducts"] != null
                && Request.QueryString["MyProducts"].Equals("T"))
                {
                    BindProdutoPorUsuario(UsuarioLogado.Id.ToString());
                }
                else if (string.IsNullOrEmpty(categoria))
                    BindCategoria();
                else
                {
                    if (string.IsNullOrEmpty(subCategoria))
                        BindSubCategoria(categoria);
                    else
                    {
                        if (string.IsNullOrEmpty(produto))
                            BindProduto(subCategoria);
                        else
                            BindLance(subCategoria, produto);
                    }
                }
            }
        }

        private void ClearSession()
        {
            if (Session[ProdutoFacade.FACADE_SESSION_NAME] != null)
                Session.Remove(ProdutoFacade.FACADE_SESSION_NAME);

            if (Session[LanceFacade.FACADE_SESSION_NAME] != null)
                Session.Remove(LanceFacade.FACADE_SESSION_NAME);
        }

        private void BindCategoria()
        {
            mvProdutos.ActiveViewIndex = 0;
            gridCategoria.DataSource = FacadeProduto.ListCategoria;
            gridCategoria.DataBind();
        }

        private void BindSubCategoria(string categoriaId)
        {
            mvProdutos.ActiveViewIndex = 1;
            gridSubCategoria.DataSource = FacadeProduto.SearchSubCategoria(int.Parse(categoriaId));
            gridSubCategoria.DataBind();
        }

        private void BindProduto(string subCategoriaId)
        {
            mvProdutos.ActiveViewIndex = 2;
            gridProduto.DataSource = FacadeProduto.ProdutosPorSubCategoria(decimal.Parse(subCategoriaId));
            gridProduto.DataBind();
        }

        private void BindProdutoPorUsuario(string usuario)
        {
            mvProdutos.ActiveViewIndex = 2;
            gridProduto.DataSource = FacadeProduto.ProdutosPorUsuario(decimal.Parse(usuario));
            gridProduto.DataBind();
        }

        private void BindLance(string subCategoria, string produtoId)
        {
            if (UsuarioLogado != null)
            {
                mvProdutos.ActiveViewIndex = 3;
                Produto produto = FacadeProduto.ProdutoPorSubCategoria(decimal.Parse(subCategoria), decimal.Parse(produtoId));

                if (produto != null)
                {
                    imgProduto.ImageUrl = produto.Imagem1;
                    hdnProdutoId.Value = produto.Id.ToString();
                    lblProdutoNome.Text = produto.Nome;
                    lblProdutoDesc.Text = produto.Descricao;
                    
                    string tipoLeilao;
                    string valor;

                    if (produto.TipoLeilao == "N")
                    {
                        tipoLeilao = "Normal";
                        valor = FacadeLance.MaiorValorDoProduto(produto.Id).ToString();
                    }
                    else
                    {
                        tipoLeilao = "Reverso";
                        valor = FacadeLance.MenorValorDoProduto(produto.Id).ToString();
                    }

                    lblProdutoTipo.Text = tipoLeilao;
                    lblProdutoValor.Text = string.Format("R$ {0}", valor == "-1" ? produto.Valor.ToString() : valor);
                }
            }
            else
            {
                Response.Write(
                        "<script type='text/javascript'>" +
                            "alert ('Usuário deve realizar o login!');" +
                            "window.location.href='Login.aspx';" +
                         "</script>"
                    );
            }
        }

        protected void gridProduto_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row != null)
            {
                e.Row.Cells[9].Visible = UsuarioLogado != null;

                if (e.Row.RowType == DataControlRowType.DataRow
                    && e.Row.DataItem is Produto)
                {
                    Produto produto = (Produto) e.Row.DataItem;

                    string tipoLeilao;
                    string valor;

                    if (produto.TipoLeilao == "N")
                    {
                        tipoLeilao = "Normal";
                        valor = FacadeLance.MaiorValorDoProduto(produto.Id).ToString();
                    }
                    else
                    {
                        tipoLeilao = "Reverso";
                        valor = FacadeLance.MenorValorDoProduto(produto.Id).ToString();
                    }

                    if (valor == "-1")
                        valor = "Sem lance";

                    e.Row.Cells[7].Text = tipoLeilao;
                    e.Row.Cells[8].Text = valor;
                }
            }
        }

        protected void btnLance_Click(object sender, EventArgs e)
        {
            decimal subCat;
            decimal produtoId;

            if (decimal.TryParse(Request.QueryString["subCat"], out subCat)
                && decimal.TryParse(hdnProdutoId.Value, out produtoId))
            {
                Produto produto = FacadeProduto.ProdutoPorSubCategoria(subCat, produtoId);

                if (produto.TipoLeilao == "N")
                {
                    decimal maiorValor = FacadeLance.MaiorValorDoProduto(produto.Id);

                    if (maiorValor == -1)
                        maiorValor = produto.Valor;

                    if (decimal.Parse(txtProduto.Text) <= maiorValor)
                    {
                        Response.Write(
                                "<script type='text/javascript'>" +
                                    string.Format("alert('Valor deve ser maior que: {0}');", maiorValor) +
                                "</script>"
                            );

                        return;
                    }
                }
                else
                {
                    decimal menorValor = FacadeLance.MenorValorDoProduto(produto.Id);

                    if (menorValor == -1)
                        menorValor = produto.Valor;

                    if (decimal.Parse(txtProduto.Text) >= menorValor)
                    {
                        Response.Write(
                                "<script type='text/javascript'>" +
                                    string.Format("alert('Valor deve ser menor que: {0}');", menorValor) +
                                "</script>"
                            );

                        return;
                    }
                }

                LanceFacade lanceFacade = new LanceFacade();
                lanceFacade.NovoLance(
                    UsuarioLogado.Id.ToString(),
                    hdnProdutoId.Value,
                    txtProduto.Text
                    );

                BindLance(subCat.ToString(), produtoId.ToString());
            }
        }
    }
}